package com.ntschy.web.generator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.BeetlTemplateEngine;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author ezreal_geng
 */
public class CodeGenerator {

    // * 代码生成目录
    private static String CODE_GENERATOR_PATH = "/code-generator";
    // * 模块名
    private static String MODULE_NAME = "bt";
    // * 代码生成基础包名
    private static String BASE_PACKAGE_NAME = "com.ntschy";
    // * 要生成的表名
    private static String[] TABLE_NAME_LIST = new String[] {"bt_supply_shop"};

    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + CODE_GENERATOR_PATH);
        gc.setFileOverride(true);
        gc.setActiveRecord(false);// 不需要ActiveRecord特性的请改为false
        gc.setEnableCache(false);// XML 二级缓存
        gc.setBaseResultMap(true);//生成基本的resultMap
        gc.setBaseColumnList(true);//生成通用查询结果列，Base_Column_List
        gc.setAuthor("cm");
        gc.setOpen(false);
        gc.setControllerName("%sController");
        gc.setServiceName("I%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setMapperName("%sMapper");
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://121.36.193.16:3306/chy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("dodoke");
        dsc.setPassword("Dodoke!123456");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        //pc.setModuleName(MODULE_NAME);
        //pc.setController(BASE_PACKAGE_NAME + ".web.controller." + MODULE_NAME);
        pc.setService(BASE_PACKAGE_NAME + "." + MODULE_NAME + ".service");
        pc.setServiceImpl(BASE_PACKAGE_NAME + "." + MODULE_NAME + ".service.impl");
        pc.setMapper(BASE_PACKAGE_NAME + "." + MODULE_NAME + ".mapper");
        pc.setEntity(BASE_PACKAGE_NAME + "." + MODULE_NAME + ".entity.dataobject");
        pc.setParent("");
        mpg.setPackageInfo(pc);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<>();
                // TODO 自定义属性注入
                map.put("aaa", "aaa");
                this.setMap(map);
            }
        };

        String templatePath = "/templates/mapper.xml.btl";

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                return projectPath + CODE_GENERATOR_PATH + "/mapper/" + pc.getModuleName()
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });

        mpg.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();
        // 配置自定义输出模板
        //指定自定义模板路径，注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
//        templateConfig.setEntity("/templates/entity2.java");
//        templateConfig.setService("/templates/service2.java");
//        templateConfig.setServiceImpl("/templates/serviceImpl2.java");
//        templateConfig.setController("/templates/controller2.java");
//        templateConfig.setMapper("/templates/mapper2.java");
//        templateConfig.setXml(null);
        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 公共父类
        strategy.setSuperControllerClass("com.ntschy.common.core.controller.BaseController");
        strategy.setSuperEntityClass("com.ntschy.common.core.BaseEntity");
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        //自动填充的配置
        TableFill createUserId = new TableFill("CreateUserID", FieldFill.INSERT);
        TableFill createTime = new TableFill("CreateTime", FieldFill.INSERT);
        TableFill updateUserId = new TableFill("UpdateUserID", FieldFill.UPDATE);
        TableFill updateTime = new TableFill("UpdateTime", FieldFill.UPDATE);
        ArrayList<TableFill> list = new ArrayList<>();
        list.add(createUserId);
        list.add(createTime);
        list.add(updateUserId);
        list.add(updateTime);
        strategy.setTableFillList(list);
        strategy.setInclude(TABLE_NAME_LIST);
        //strategy.setControllerMappingHyphenStyle(true);
        //strategy.setTablePrefix(MODULE_NAME + "_");

        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new BeetlTemplateEngine());
        mpg.execute();
    }
}
